package com.demo.util;


import org.apache.poi.ss.usermodel.DateUtil;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;

import java.util.Date;
import java.util.concurrent.*;

/**
 * ThreadPoolExecutor 是 Java 标准库提供的线程池实现类，
 * 它提供了一些基本的线程池配置选项，例如核心线程数、最大线程数、队列容量等。
 * 它可以用于管理线程池并执行异步任务。
 *
 * ThreadPoolExecutor 的构造函数有多个参数，其中最重要的是核心线程数、最大线程数和队列。
 * 核心线程数是线程池中保持活动状态的线程数，最大线程数是线程池中允许的最大线程数，
 * 队列是用于保存等待执行的任务的数据结构。
 *
 * ThreadPoolExecutor 还提供了一些其他的配置选项，例如线程池的存活时间、拒绝策略等。
 * 拒绝策略用于处理无法提交给线程池的任务，例如当线程池已满时
 * @author liangalong[liangalong2022@aliyun.com]
 * @date 2023-04-13 11:01*/
@EnableAsync
@Configuration
public class ThreadPoolConfig2 {

    @Bean
    public ThreadPoolExecutor ThreadPoolExecutor(){
        //核心线程数
        int corePoolSize = 10;
        //最大线程数
        int maxPoolSize = 120;
        //队列容量
        long keepAliveTime = 5000;
        //创建了一个容量为 25 的阻塞队列，用于存储等待执行的任务。ArrayBlockingQueue
        // 是一个基于数组的有界阻塞队列，它按照 FIFO（先进先出）的顺序对元素进行排序。
        // 当队列已满时，任何试图将元素放入队列的操作都将被阻塞，直到队列中有空间为止。
        BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(25);
        //创建了一个拒绝策略，用于处理无法提交给线程池的任务。
        // AbortPolicy 是 ThreadPoolExecutor 提供的一种拒绝策略，
        // 它会直接抛出一个 RejectedExecutionException 异常，表示无法接受新的任务。
        // 如果你想使用其他的拒绝策略，例如将任务放回队列或者丢弃任务，
        // 可以查看 ThreadPoolExecutor 的其他拒绝策略。
        RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy();
        //线程名称前缀
        ThreadFactory threadFactory = new MyThreadFactory("MyThreadFactoryDemo");

        ThreadPoolExecutor executor = new ThreadPoolExecutor(
                corePoolSize, maxPoolSize, keepAliveTime,
                TimeUnit.MILLISECONDS, workQueue, threadFactory ,handler);
        return executor;
    }

}
